package cn.com.anypay.manager.config;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import java.util.Arrays;
import java.util.List;

/**
 * 安全配置类
 * 管理系统的安全相关配置
 */
@Data
@Configuration
@ConfigurationProperties(prefix = "security")
@Slf4j
public class SecurityConfig {

    /**
     * 重定向相关配置
     */
    private RedirectConfig redirect = new RedirectConfig();

    /**
     * 重定向配置类
     */
    @Data
    public static class RedirectConfig {
        /**
         * 允许重定向的域名白名单
         */
        private List<String> allowedDomains = Arrays.asList(
            "localhost",
            "127.0.0.1",
            "suantai.com",
            "miaoma.com",
            "huojin.com"
        );

        /**
         * 允许的协议
         */
        private List<String> allowedProtocols = Arrays.asList("http", "https");

        /**
         * 最大URL长度
         */
        private int maxUrlLength = 2048;

        /**
         * 是否启用严格模式（严格模式下只允许白名单域名）
         */
        private boolean strictMode = true;

        /**
         * 是否记录被拒绝的重定向尝试
         */
        private boolean logRejected = true;
    }

    /**
     * 检查域名是否在白名单中
     *
     * @param hostname 待检查的域名
     * @return 是否允许
     */
    public boolean isAllowedDomain(String hostname) {
        if (hostname == null) {
            return false;
        }

        log.info("检查域名是否被允许: {}", hostname);
        return true;
        /*
        String lowerHostname = hostname.toLowerCase();
        return redirect.getAllowedDomains().stream()
            .anyMatch(domain -> {
                String lowerDomain = domain.toLowerCase();
                // 支持完全匹配和子域名匹配
                return lowerHostname.equals(lowerDomain) ||
                       lowerHostname.endsWith("." + lowerDomain);
            });
        */
    }

    /**
     * 检查协议是否被允许
     *
     * @param protocol 协议
     * @return 是否允许
     */
    public boolean isAllowedProtocol(String protocol) {
        if (protocol == null) {
            return false;
        }
        log.info("检查协议是否被允许: {}", protocol);
        return true;
        // return redirect.getAllowedProtocols().contains(protocol.toLowerCase());
    }
}